package com.example.demo5;

import java.io.*;
import java.net.Socket;
import java.util.Properties;

/**
 * 服务端读取线程类,用于处理客户端的连接
 */
public class ServerReaderThread extends Thread {
    private Socket socket;

    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // 处理的信息 有注册信息和登录信息
        try {
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            while (true) {
                int type = dis.readInt();
                switch (type) {
                    case 1:
                        register(); // 注册
                        break;
                    case 2:
                        login(); // 登录
                        break;
                }
            }
        } catch (Exception e) {
            // 离线逻辑
            System.out.println("有人离线了：" + socket.getRemoteSocketAddress());
            e.printStackTrace();
        }
    }

    /**
     * 注册方法,处理客户端的注册请求
     *
     * @throws Exception 抛出异常
     */
    private void register() throws Exception {
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String loginName = dis.readUTF();
        String passWord = dis.readUTF();

        // 开始做判断,登录名是否重复的问题。
        String result = "注册成功";
        if (exist(loginName)) {
            result = "注册失败,您注册的登录名称已被占用！";
        } else {
            // 保存登录名和密码
            Properties properties = new Properties();
            properties.setProperty(loginName, passWord);
            properties.store(new FileWriter(Server.FILE_PATH, true), "");
        }

        // 响应结果回去
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(result);
        dos.flush();
    }

    /**
     * 登录方法,处理客户端的登录请求
     *
     * @throws IOException 抛出IO异常
     */
    private void login() throws IOException {
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String loginName = dis.readUTF();
        String passWord = dis.readUTF();

        String result = "登录成功";
        File file = new File(Server.FILE_PATH);
        if (file.exists()) {
            // 提取全部的登录名,看是否存在当前这个登录名
            Properties properties = new Properties();
            properties.load(new FileReader(file));
            // 校验登录名：根据登录名获取密码
            String OkPwd = properties.getProperty(loginName);
            if (OkPwd == null) {
                result = "登录名称错误";
            } else {
                // 比较密码
                if (!OkPwd.equals(passWord)) {
                    result = "密码错误！";
                }
            }
        } else {
            result = "当前无任何用户信息,无法登录！";
        }

        // 响应result即可
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(result);
        dos.flush();
    }

    /**
     * 检查登录名是否已存在的方法
     *
     * @param loginName 待检查的登录名
     * @return 如果登录名已存在返回true,否则返回false
     * @throws Exception 抛出异常
     */
    public boolean exist(String loginName) throws Exception {
        File file = new File(Server.FILE_PATH);
        if (file.exists()) {
            // 提取全部的登录名,看看是否有重复
            Properties properties = new Properties();
            properties.load(new FileReader(file));
            if (properties.containsKey(loginName)) {
                return true;
            }
        }
        return false;
    }
}
